package com.bdqn.pojo;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * sys_role
 *
 * @author LILIBO
 * @since 2021-11-24
 */
// @Data // 发生[org.hibernate.HibernateException: collection was evicted]异常，取消@DATA注解，使用手动Getter/Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Entity
@Table(name = "sys_role")
public class RoleInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 编号
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "role_id")
    private Long roleId;

    /**
     * 角色名称
     */
    @Column(name = "role_name")
    private String roleName;

    /**
     * 角色描述
     */
    @Column(name = "role_desc")
    private String roleDesc;

    /**
     * 状态
     */
    @Column(name = "role_flag")
    private Long roleFlag;

    /**
     * 用户集合（角色与用户之间：一对多关系）
     *
     * @OneToMany()
     * targetEntity 属性表示关联的实体类型。
     * fetch 属性表示加载策略，FetchType取值有LAZY及EAGER，LAZY表示延迟加载，EAGER表示立即加载。 @ManyToOne注解也包含该属性，且默认值为EAGER，表示即加载，所以查询User时通过左外关联立即获取Role数据；@OneToMany注解该属性默认值为LAZY。
     * cascade 属性表示级联操作，CascadeType取值有PERSIST、REMOVE、ALL……等。PERSIST表示级联持久化(保存)操作，REMOVE级联删除，ALL级联所有操作。@ManyToOne注解也包含该属性，但一般不在多的一方进行级联操作。
     * mappedBy 属性用来设置对象之间的关系维护方(关系维护通过操作外键完成)。如不指定 mappedBy 属性，则对象均由自己维护关系(外键)，操作一方对象时，会额外产生更新外键的 SQL 语句。所以一般在@OneToMany注解中指定mappedBy属性，且属性值为多方对象中关联的一方属性名，并且此时一方实体中不能添加@JoinColumn 注解。
     */
    @OneToMany(targetEntity = UserInfo.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "role")
    private Set<UserInfo> users = new HashSet<>();

    public RoleInfo(String roleName, String roleDesc, Long roleFlag) {
        this.roleName = roleName;
        this.roleDesc = roleDesc;
        this.roleFlag = roleFlag;
    }

    public Long getRoleId() {
        return roleId;
    }

    public void setRoleId(Long roleId) {
        this.roleId = roleId;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleDesc() {
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }

    public Long getRoleFlag() {
        return roleFlag;
    }

    public void setRoleFlag(Long roleFlag) {
        this.roleFlag = roleFlag;
    }

    public Set<UserInfo> getUsers() {
        return users;
    }

    public void setUsers(Set<UserInfo> users) {
        this.users = users;
    }

}
